// FunctionDeclarationC11.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <string>

/**
 * 什么情况下，需要返回函数指针
 * 情况1：由于业务需要，根据不同的条件执行不同的方法；
 * 这种情况，可以通过记录一个枚举变量，不同情况，都可以调用
 * 带该枚举作为参数的同一个方法，在该方法中处理不同的逻辑
 */

// 命名空间（文件）作用域中的声明
// （定义在后面提供）
int f1();

// 拥有默认实参的简单函数，不返回内容
void f0(const std::string& arg = "world")
{
	std::cout << "Hello, " << arg << '\n';
}

// 返回指向 f0 的指针的函数
auto fp11() -> void(*)(const std::string&)
{
	return f0;
}

// 返回指向 f0 的指针的函数，C++11 前的风格
void (*fp03())(const std::string&)
{
	return f0;
}

int main()
{
	//f0();
	fp11()("test");
	//fp03()("again");
	//int f2(std::string); // 块作用域中的声明
	//std::cout << f2("bad12") << '\n';
}

// 简单的非成员函数，返回 int
int f1()
{
	return 42;
}

// 拥有异常说明和函数 try 块的函数
int f2(std::string str) noexcept try
{
	return std::stoi(str);
}
catch (const std::exception& e)
{
	std::cerr << "stoi() failed!\n";
	return 0;
}

// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu

// Tips for Getting Started: 
//   1. Use the Solution Explorer window to add/manage files
//   2. Use the Team Explorer window to connect to source control
//   3. Use the Output window to see build output and other messages
//   4. Use the Error List window to view errors
//   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
//   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
